package apresentacaoSwing;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import negocio.Fiador;
import negocio.GerenteFiador;
import negocio.Utilidades;

public class TelaFiador {

	private static final String FRM_PRINCIPAL_TITULO = "Menu Fiadores";
	private static final int FRM_PRINCIPAL_LARGURA = 650;
	private static final int FRM_PRINCIPAL_ALTURA = 400;
	private static final Color FRM_PRINCIPAL_COR_FUNDO = Color.WHITE;

	private static final Color TB_DADOS_COR_FUNDO = Color.WHITE;
	private static final Color TB_DADOS_CABEC_COR_FUNDO = Color.BLUE;
	private static final Color TB_DADOS_CABEC_COR_TEXTO = Color.BLACK;
	private static final String[] TITULOS_COLUNAS = {
		"Nome", "Data de Nascimento", "Endere�o", "CPF", "Telefone", "RG", "Email", "Estado Civil", "Renda"};

	private static final Color PN_TITULO_COR_FUNDO = Color.WHITE;
	private static final Color PN_TITULO_COR_TEXTO = Color.BLACK;
	private static final Color PN_BORDA_COR = Color.BLUE;

	private static final String PN_CONSULTAS_TITULO = "Consultas";
	private static final Color PN_CONSULTAS_COR_FUNDO = Color.WHITE;
	private static final Color PN_CONSULTAS_ACOES_COR_FUNDO = Color.WHITE;

	private static final String PN_MAIS_OPCOES_TITULO = "Opcoes";
	private static final Color PN_MAIS_OPCOES_COR_FUNDO = Color.WHITE;
	private static final String[] PN_MAIS_OPCOES_NOMES = {"Adicionar", "Alterar", "Remover","Menu Principal"};

	private JFrame frmPrincipal;

	private JTable tbDados;

	private JRadioButton rbPorNome;
	private JRadioButton rbPorCpf;
	private JRadioButton rbPorAniversario;

	private JPanel pnConsultaNome;
	private JPanel pnConsultaCpf;

	private JTextField tfConsultaNome;
	private JTextField tfConsultaCpf;

	private JPanel pnAniversario;

	private JTextField tfConsultaAnivDia;
	private JTextField tfConsultaAnivMes;

	private GerenteFiador gerFiador;

	public TelaFiador(TelaSistemaImobiliaria telaSistema, GerenteFiador gerFiador, int i) {
		this.gerFiador = gerFiador;
		montaJanela();
	}

	public void mostrar() {
		frmPrincipal.setVisible(true);
	}

	public void alteraLinhaTabela(Fiador f, int numLinha) {
		DefaultTableModel tm = (DefaultTableModel) tbDados.getModel();
		tm.setValueAt(f.getNome(), numLinha, 0);
		tm.setValueAt(Utilidades.geraDate(f.getDataNasc()), numLinha, 1);
		tm.setValueAt(f.getEndereco(), numLinha, 2);
		tm.setValueAt(f.getCpf(), numLinha, 3);
		tm.setValueAt(f.getTelefone(), numLinha, 4);
		tm.setValueAt(f.getRg(), numLinha, 5);
		tm.setValueAt(f.getEmail(), numLinha, 6);
		tm.setValueAt(f.getEstadoCivil(), numLinha, 7);
		tm.setValueAt(("R$")+f.getRenda(), numLinha, 8);
		tbDados.repaint();
	}

	private void montaJanela() {

		// Cria e altera propriedades da janela
		frmPrincipal = new JFrame(FRM_PRINCIPAL_TITULO);
		frmPrincipal.setSize(FRM_PRINCIPAL_LARGURA, FRM_PRINCIPAL_ALTURA);
		frmPrincipal.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frmPrincipal.setLayout(new BorderLayout());
		frmPrincipal.getContentPane().setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.setLocationRelativeTo(null);
		frmPrincipal.addWindowListener(new ManipuladorJanela());

		// Parte superior da janela, contendo as opcoes de consulta e demais operacoes.
		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.add(montaPanelConsultas(), BorderLayout.CENTER);
		pnOpcoes.add(montaPanelOpcoes(), BorderLayout.EAST);
		pnOpcoes.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
		pnOpcoes.setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.add(pnOpcoes, BorderLayout.NORTH);

		// Parte inferior da janela, contendo a tabela com os dados dos contatos.
		tbDados = new JTable();
		tbDados.setBackground(TB_DADOS_COR_FUNDO);
		tbDados.getTableHeader().setBackground(TB_DADOS_CABEC_COR_FUNDO);
		tbDados.getTableHeader().setForeground(TB_DADOS_CABEC_COR_TEXTO);
		JScrollPane pnDados = new JScrollPane(tbDados);
		pnDados.getViewport().setBackground(FRM_PRINCIPAL_COR_FUNDO);
		frmPrincipal.add(pnDados, BorderLayout.CENTER);
	}

	private JPanel montaPanelConsultas() {

		JPanel pnConsultas = new JPanel();
		pnConsultas.setLayout(new BorderLayout());
		pnConsultas.setBorder(BorderFactory.createEmptyBorder(0,0,0,5));
		pnConsultas.setOpaque(false);

		JLabel titulo = new JLabel(PN_CONSULTAS_TITULO);
		titulo.setBackground(PN_TITULO_COR_FUNDO);
		titulo.setForeground(PN_TITULO_COR_TEXTO);
		titulo.setOpaque(true);
		pnConsultas.add(titulo, BorderLayout.NORTH);

		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.setBackground(PN_CONSULTAS_COR_FUNDO);
		pnOpcoes.setBorder(BorderFactory.createLineBorder(PN_BORDA_COR));
		pnOpcoes.add(montaPanelOpcoesConsulta(), BorderLayout.NORTH);
		pnOpcoes.add(montaPanelAcoesConsulta(), BorderLayout.SOUTH);
		pnConsultas.add(pnOpcoes, BorderLayout.CENTER);

		return pnConsultas;
	}

	private JPanel montaPanelOpcoesConsulta() {

		ManipuladorBotoesConsultas ev = new ManipuladorBotoesConsultas();

		ButtonGroup bgConsultas = new ButtonGroup();

		rbPorNome = new JRadioButton("Nome");
		rbPorNome.addActionListener(ev);
		rbPorNome.setOpaque(false);
		bgConsultas.add(rbPorNome);

		rbPorCpf = new JRadioButton("CPF");
		rbPorCpf.addActionListener(ev);
		rbPorCpf.setOpaque(false);
		bgConsultas.add(rbPorCpf);

		rbPorAniversario = new JRadioButton("Data de Nascimento");
		rbPorAniversario.addActionListener(ev);
		rbPorAniversario.setOpaque(false);
		bgConsultas.add(rbPorAniversario);

		JPanel pnBotoes = new JPanel();
		pnBotoes.setLayout(new FlowLayout(FlowLayout.CENTER));
		pnBotoes.setOpaque(false);
		pnBotoes.add(rbPorNome);
		pnBotoes.add(rbPorCpf);
		pnBotoes.add(rbPorAniversario);

		return pnBotoes;
	}

	private JPanel montaPanelAcoesConsulta() {

		JPanel pnAcoes = new JPanel();
		pnAcoes.setBackground(PN_CONSULTAS_ACOES_COR_FUNDO);

		pnConsultaNome = new JPanel();
		pnConsultaNome.setVisible(false);
		pnConsultaNome.setOpaque(false);

		pnConsultaNome.add(new JLabel("Digite o nome ou parte do nome: "));

		tfConsultaNome = new JTextField(20);
		tfConsultaNome.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						gerFiador.consultaNome(tfConsultaNome.getText());
					}
				});
		pnConsultaNome.add(tfConsultaNome);

		pnAcoes.add(pnConsultaNome);

		pnConsultaCpf = new JPanel();
		pnConsultaCpf.setVisible(false);
		pnConsultaCpf.setOpaque(false);

		pnConsultaCpf.add(new JLabel("Digite o cpf ou parte do cpf: "));

		tfConsultaCpf = new JTextField(20);
		tfConsultaCpf.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						gerFiador.consultaPorCpf(tfConsultaCpf.getText());
					}
				});
		pnConsultaCpf.add(tfConsultaCpf);

		pnAcoes.add(pnConsultaCpf);

		pnAniversario = new JPanel();
		pnAniversario.setOpaque(false);
		pnAniversario.setVisible(false);

		pnAniversario.add(new JLabel("Dia: "));

		tfConsultaAnivDia = new JTextField(4);
		pnAniversario.add(tfConsultaAnivDia);

		pnAniversario.add(new JLabel("Mes: "));

		tfConsultaAnivMes = new JTextField(4);
		pnAniversario.add(tfConsultaAnivMes);

		JButton btConsultar = new JButton("Mostrar");
		btConsultar.addActionListener(
				new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						try {
							gerFiador.consultaDataNasc(
									Integer.parseInt(tfConsultaAnivDia.getText()),
									Integer.parseInt(tfConsultaAnivMes.getText()));
						}
						catch(NumberFormatException exc) {
							JOptionPane.showMessageDialog(null,
									"Voce digitou um numero incorreto!!!",
									"Erro ao consultar por aniversario",
									JOptionPane.ERROR_MESSAGE);
						}
					}
				});
		pnAniversario.add(btConsultar);

		pnAcoes.add(pnAniversario);

		return pnAcoes;
	}

	private JPanel montaPanelOpcoes() {

		JPanel pnOpcoes = new JPanel(new BorderLayout());
		pnOpcoes.setBorder(BorderFactory.createEmptyBorder(0,5,0,0));
		pnOpcoes.setOpaque(false);

		JLabel lbTitulo = new JLabel(PN_MAIS_OPCOES_TITULO);
		lbTitulo.setBackground(PN_TITULO_COR_FUNDO);
		lbTitulo.setForeground(PN_TITULO_COR_TEXTO);
		lbTitulo.setOpaque(true);
		pnOpcoes.add(lbTitulo, BorderLayout.NORTH);

		// Adiciona painel contendo botoes para as opcoes
		JPanel pnConteudo = new JPanel();
		JPanel pnBotoes = new JPanel(new GridLayout(PN_MAIS_OPCOES_NOMES.length,1,2,2));
		pnBotoes.setOpaque(false);

		JButton btAdicionar = new JButton(PN_MAIS_OPCOES_NOMES[0]);
		btAdicionar.addActionListener(new ManipuladorBotaoAdicionar(this));
		pnBotoes.add(btAdicionar);

		JButton btRemover = new JButton(PN_MAIS_OPCOES_NOMES[2]);
		btRemover.addActionListener(new ManipuladorBotaoRemover());
		pnBotoes.add(btRemover);

		JButton btMPrincipal = new JButton(PN_MAIS_OPCOES_NOMES[3]);
		btMPrincipal.addActionListener(new ManipuladorBotaoMPrincipal(this));
		pnBotoes.add(btMPrincipal);

		pnConteudo.setBackground(PN_MAIS_OPCOES_COR_FUNDO);
		pnConteudo.setBorder(BorderFactory.createLineBorder(PN_BORDA_COR));
		pnConteudo.add(pnBotoes);
		pnOpcoes.add(pnConteudo, BorderLayout.CENTER);

		return pnOpcoes;
	}

	private class ManipuladorBotoesConsultas implements ActionListener {

		public void actionPerformed(ActionEvent e) {

			pnConsultaNome.setVisible(e.getSource() == rbPorNome);
			pnConsultaCpf.setVisible(e.getSource() == rbPorCpf);
			pnAniversario.setVisible(e.getSource() == rbPorAniversario);

		}

	}

	private class ManipuladorBotaoAdicionar implements ActionListener {

		private TelaFiador telaF;

		public ManipuladorBotaoAdicionar(TelaFiador telaF) {
			this.telaF = telaF;
		}

		public void actionPerformed(ActionEvent e) {

			TelaNovoFiador f = new TelaNovoFiador(telaF, gerFiador);
			f.mostrar();

		}

	}

	private class ManipuladorBotaoRemover implements ActionListener {

		public void actionPerformed(ActionEvent e) {

			int numLinha = tbDados.getSelectedRow();

			if(numLinha >= 0) {

				Fiador f = gerFiador.consultaNome((String) tbDados.getValueAt(numLinha,0));

				if(JOptionPane.showConfirmDialog(frmPrincipal, "Deseja remover o fiador "+f.getNome()+"?",
						"Remocao de Fiador", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {

					gerFiador.remover(f);

					DefaultTableModel tm = (DefaultTableModel) tbDados.getModel();
					tm.removeRow(numLinha);
					tbDados.repaint();
				}

			} else {
				JOptionPane.showMessageDialog(null,
						"Selecione uma linha da lista de fiadores antes de remover.",
						"Erro",
						JOptionPane.ERROR_MESSAGE);
			}
		}

	}

	private class ManipuladorBotaoMPrincipal implements ActionListener {

		private TelaFiador telaF;

		public ManipuladorBotaoMPrincipal(TelaFiador telaF) {
			this.telaF = telaF;
		}

		public void actionPerformed(ActionEvent e) {

			TelaSistemaImobiliaria tsi = new TelaSistemaImobiliaria();
			tsi.mostrar();
			frmPrincipal.dispose();


		}

	}

	private class ManipuladorJanela extends WindowAdapter {

		public void windowClosing(WindowEvent e) {
			try{

				//gerCliente.adicionar();

			} catch (Exception exc) {

				JOptionPane.showMessageDialog(null,
						exc.getMessage(),
						"Erro",
						JOptionPane.ERROR_MESSAGE);
			}
		}

	}
}